package 设计模式.一单例模式.snippet7;

/**
 * 优缺点说明:
 * 1)这种方式采用了类装载的机制来保证初始化实例时只有-一个线程。
 * 2)靜静 态内部类方式在Singleton类被装载时并不会立即实例化，而是在需要实例化
 * 时，调用getInstance万法，才会装载SingletonInstance类，从而完成Singleton的
 * 实例化。”
 * 3)类的静态属性只会在第一次加载类的时候初始化，所以在这里，JVM帮助我们
 * 保证了线程的安全性，在类进行初始化时，别的线程是无法进入的。
 * 4)优点:避免了线程不安全，利用静态内部类特点实现延迟加载，效率高
 * 5)结论:推荐使用.
 * 类在装载时其他线程无法进入
 */
public class SingletonTest07 {
    public static void main(String[] args) {
        System.out.println("使用静态内部类完成单例模式");
        //测试
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();

        System.out.printf("instance1与instance2是否相等:%s%n", instance1 == instance2);
        System.out.println(instance1.hashCode());
        System.out.println(instance2.hashCode());
    }
}

//懒汉式 静态内部类 推荐使用
//特点1.外部类被装载时，内部类不会被装载
//特点2.调用getInstance方法时，内部类被装载一次
class Singleton {
    private static volatile Singleton INSTANCE;

    //构造器私有化
    private Singleton() {
    }

    //写一个静态内部类，该类中有一个静态属性Singleton
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    //提供一个静态得共有方法，加入同步处理的代码(添加synchronized关键字)，解决线程安全问题
    public static Singleton getInstance() {
        //调用时才会装载改实例
        return SingletonInstance.INSTANCE;
    }
}